# -*- coding: utf-8 -*-
from datetime import datetime
from django.db import models

from fornecedor.models import Fornecedor
from managers import PregaoManager, PropostaManager


class Item(models.Model):
    class Meta:
        db_table = 'item'

    descricao = models.CharField(u'Descrição', max_length=60)

    def __unicode__(self):
        return self.descricao

class ItemPregao(models.Model):
    class Meta:
        db_table = 'item_pregao'

    quantidade = models.IntegerField('Quantidade', max_length=5)
    item = models.ForeignKey('Item', related_name='itens')
    pregao = models.ForeignKey('Pregao')
    prazo_entrega = models.IntegerField('Prazo de Entrega')

    def __unicode__(self):
        return u'%s do %s (%s)' % (self.item, self.pregao, self.quantidade)

    def can_selecionar_proposta(self):
        # possui alguma proposta ja selecionada?
        query = self.proposta_set.filter(selecionada=True)
        if query.exists():
            return False

        # todas as propostas do item possuem pontuação?
        pontuacao = self.proposta_set.filter(pontuacao__isnull=False)
        if query.exists():
            return False

        return True

class Pregao(models.Model):
    class Meta:
        db_table = 'pregao'
        verbose_name='Pregão'
        verbose_name_plural='Pregões'
        ordering = ('dt_fim',)
        permissions = (
            ('ver_abertos', u'Visualiza pregões abertos'),
            ('can_add', u'Pode abrir pregão'),
            ('ver_todos', u'Visualiza todos pregoes'),
            ('can_classificar', u'Pode classificar propostas'),
            )

    objects = PregaoManager()

    codigo = models.CharField('codigo', max_length=20)
    dt_inicio = models.DateTimeField(u'Data inicial')
    dt_fim = models.DateTimeField(u'Data final')
    dt_divulgacao = models.DateField(u'Data de divulgação', db_column="dt_divulgacao2")

    def __unicode__(self):
        return u'%s' % self.codigo

    def is_ativo(self):
        dt = datetime.now()
        if self.dt_inicio < dt and self.dt_fim > dt:
            return True
        return False

    def is_futuro(self):
        dt = datetime.now()
        if self.dt_inicio > dt:
            return True
        return False

    def can_classificar(self):
        if self.is_futuro() or self.is_ativo():
            return False
        query = self.itempregao_set.filter(proposta__pontuacao__isnull=True)
        if not query.exists():
            return False
        return True

    def get_qtd_propostas(self):
        p = 0
        for i in self.itempregao_set.all():
            p += i.proposta_set.count()
        return p

    def can_selecionar_proposta(self):
        if self.dt_fim > datetime.now():
            return False

        for item in self.itempregao_set.all():
            if not item.can_selecionar_proposta():
                return False

        return True

    def finalizar(self):
        if self.is_ativo():
            self.dt_fim = datetime.now();
            self.save()

    def classificar_propostas(self):
        for item in self.itempregao_set.all():
            maior = item.proposta_set.get_maior().valor
            menor = item.proposta_set.get_menor().valor
            den = maior-menor
            for p in item.proposta_set.all():
                if den == 0:
                    ip = 0
                else:
                    ip = (maior-p.valor)/den
                if p.fornecedor.is_homologado():
                    p.pontuacao = p.fornecedor.indice * ip
                else:
                    p.pontuacao = 0
                p.save()

    def save(self, *args, **kwargs):
        if not self.codigo:
            c = Pregao.objects.filter(dt_inicio__year=self.dt_inicio.year).count()+1
            self.codigo = '%s/%s' % (self.dt_inicio.year, c)
        super(Pregao, self).save(*args, **kwargs)


class Proposta(models.Model):
    class Meta:
        db_table = 'proposta'
        ordering = ['-pontuacao', '-valor']

    objects = PropostaManager()

    selecionada = models.BooleanField(u'Selecionada', default=False)
    pontuacao = models.FloatField(u'Pontuação',max_length=3, null=True, blank=True)
    fornecedor = models.ForeignKey(Fornecedor)
    item = models.ForeignKey('ItemPregao')
    valor = models.FloatField('Valor')

    def selecionar(self):
        query = Proposta.objects.filter(item__proposta__selecionada=True, item__id=self.item.id)
        if query.exists():
            for p in query:
                p.selecionada = False
                p.save()

        self.selecionada = True
        self.save()

    def __unicode__(self):
        return u'Proposta do fornecedor %s (%s)' %(self.fornecedor, self.valor)

    def get_valor(self):
        return (u'R$ %.2f' % self.valor).replace('.',',')

    def get_pontuacao(self):
        if not self.pontuacao is None:
            return (u'%.4f' % self.pontuacao).replace('.',',')
        return ''






